const { app, ipcMain, BrowserWindow, Menu, Notification, desktopCapturer } = require("electron");
// 引入node的 path 和url模块
const path = require("path");
const http = require('http');
const url = require('url');
const fs = require('fs');
const process = require('process');
let tray = require('./tray');  //托盘模块封装
let logger = require('./mylog'); //日志模块封装

// 获取在 package.json 中的命令脚本传入的参数，来判断是开发还是生产环境
const mode = process.argv[2];

let mainWindow = null;
//程序单例运行
const gotTheLock=app.requestSingleInstanceLock();

if(!gotTheLock){
    if (process.platform !== "darwin") {
        app.quit();
    }
    app.exit();
}else{
    app.on("second-instance",(event,commandLine,workingDirectory)=>{
        if(mainWindow){
            if(mainWindow.isMinimized()) mainWindow.restore();
            mainWindow.focus();
            mainWindow.show();
        }
    })
}

 

let config;  //配置文件读取存储
let httpServer;  // http服务

let appDir = app.getAppPath();
logger.info("1"+appDir);



if(appDir.endsWith("app.asar")){
    appDir = path.resolve(appDir,"..");
    appDir = path.resolve(appDir,"..");
}

// 监听asynchronous-message，接收渲染进程发送的消息
ipcMain.on('log', (event, arg) => {
   logger.info(arg);
})

function loadConfig() {
    // 获取安装目录
    // 这里要注意 获取的安装目录是反斜杠 也就是 c:\dev\xxxx
    // 这肯定是不行的  nodejs在使用这种地址是读取不了的 
    // 所以 后边加了一个replace 用于转换反斜杠
    // 拼接好安装目录下的config.json
    let configPath = path.join(appDir, 'project-pc.json');
    logger.info("configPath : "+ configPath);
    // 使用fs读取文件内容
    // 使用fs读取文件内容
    try {
        let data = fs.readFileSync(configPath, 'utf-8');
        if (data) {
            // 注意要转换json
            config = JSON.parse(data);
            console.log(config);
            logger.info(config);
        }else{
            logger.warn("readFileSync 读取文件内容数据异常。");
        }
    } catch (err) {
        console.error(err);
        logger.error("loadConfig报错: "+ err);
    }
}



function createWindow() {
    Menu.setApplicationMenu(null);
    // Create the browser mainWindow.
    mainWindow = new BrowserWindow({
        width: 1100,
        height: 640,
        title:config.title, //如果html设置了这里就不生效
        icon: path.join(appDir, "favicon.ico"),
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
            webSecurity: false,
            preload:path.join(appDir,'preload.js')
        },
    });
    
    tray(mainWindow, config.title, path.join(appDir, "app.png"));
    //判断是否是开发模式 
    if("dev" == mode){
        mainWindow.loadURL("http://localhost:3000")
        // mainWindow.webContents.openDevTools({mode:'detach'}); 

    }else{
        logger.info(__dirname);
        logger.info(path.join(__dirname, './build/index.html'));
        mainWindow.loadURL(url.format({
        pathname:path.join(__dirname, './build/index.html'), 
        protocol:'file:', 
        slashes:true 
        }))
    }
    

    // ************* 系统托盘*********************** 
    // 当我们点击关闭时触发close事件，我们按照之前的思路在关闭时，隐藏窗口，隐藏任务栏窗口
    // event.preventDefault(); 禁止关闭行为(非常必要，因为我们并不是想要关闭窗口，所以需要禁止默认行为)
    mainWindow.on('close', (event) => {
        mainWindow.hide();
        mainWindow.setSkipTaskbar(true);
        event.preventDefault();
    });

    if (!app.isPackaged) {
        // Open the DevTools.
        //mainWindow.webContents.openDevTools();
    }
}

app.whenReady().then(() => {
    logger.info("视频通讯客户端程序1.0.0.1版本");
    loadConfig();
    app.setAppUserModelId( config.title);

    logger.info("获取配置信息完成。");

    createWindow();
    logger.info("createWindow 完成。");

    
    app.on("activate", function () {
        if (BrowserWindow.getAllWindows().length === 0) createWindow();
    });

    var option = {
        icon: path.join(appDir, "app.png"),
        body: config.title + "启动成功"
    };
    var myNotification = new Notification(option).show();

    logger.info(config.title + "启动成功");
});

app.on("window-all-closed", function () {
    console.log('project-pc exit.')
    if (process.platform !== "darwin") {
        app.quit();
    }
    app.exit();
});
